/**
 * 路由鉴权
 * 项目中的路由能不能被访问的权限设置
 * 全局守卫：项目当中任意路由切换都会触发的钩子
 */
import router from '@/router/index'
// 引入进度条
import NProgress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'
// 引入大仓库
import pinia from '@/store'
// 引入用户相关的仓库
import useUserStore from '@/store/modules/user'
// 引入配置文件
import setting from '@/setting'

// 进度条配置
NProgress.configure({ showSpinner: false })

// 获取用户仓库
const userStore = useUserStore(pinia)

/**
 * 全局前置守卫
 * to: 即将跳转到哪个路由
 * from: 从哪个路由来
 * next: 路由的放行函数，一定要调用，调用的时候可以传参，参数是一个路由路径
 */
router.beforeEach(async (to: any, from: any, next: any) => {
  document.title = setting.title + '-' + to.meta.title
  NProgress.start()
  // 获取 token，判断用户是否登录
  const token = userStore.token
  // 获取用户信息
  const username = userStore.username
  if (token) {
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      // 判断是否有用户信息，有就放行，没有就获取用户信息再放行
      if (username) {
        next()
      } else {
        try {
          await userStore.userInfo()
          next()
        } catch {
          // 获取用户信息失败 | token 失效 | 本地存储的 token 被人为修改 等情况
          await userStore.userLogout()
          next({ path: '/login', query: { redirect: to.path } })
        }
      }
    }
  } else {
    if (to.path === '/login') {
      next()
    } else {
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
})

/**
 * 全局后置守卫
 * to: 即将跳转到哪个路由
 * from: 从哪个路由来
 */
router.afterEach((to: any, from: any) => {
  NProgress.done()
})

/**
 * 1. 任意路由切换实现进度条业务  【要使用 nprogress 依赖】
 * 2. 路由鉴权 【路由组件访问权限的设置】
 *    用户未登录：可以访问 /logo，其余的路由不能被访问
 *    用户已登录，可以访问其余的路由，不能访问 /login
 */
